﻿using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Linq;

using Gman.Service.Implementations;
using Gman.Service.Interfaces;
using Gman.Service.Message.Resquest_Response;
using Gman.Entity.Entities;
using Gman.Business;
using AutoMapper;

using System.Transactions;

namespace Gman.Service.Implementations
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class OperacionService : IOperacionService
    {
        #region IGestionService Members

        public string HelloWorld()
        {
            return "Hello world";
        }

        #endregion

        #region Sede

        private SedeBL Sede = new SedeBL();

        public Response_Sede RegistrarSede(Request_Sede _Request_Sede)
        {
            Response_Sede res = new Response_Sede();
            res.CorrelationId = _Request_Sede.RequestId;

            SedeBE SedeDTO = _Request_Sede.SedeDTO as SedeBE;

            if (_Request_Sede.LoadOptions.Contains("AddSede"))
            {

                SedeBL oSedeBL = new SedeBL();
                SedeBE oCopyBE = Mapper.Map<SedeBE, SedeBE>(SedeDTO);

                res.InsSede = oSedeBL.Registrar(oCopyBE);

                SedeDTO.IDSede = oCopyBE.IDSede;
            }

            return res;
        }

        public Response_Sede ListarSedes(Request_Sede _Request_Sede)
        {
            Response_Sede res = new Response_Sede();
            res.CorrelationId = _Request_Sede.RequestId;

            SedeBE SedeDTO = _Request_Sede.SedeDTO as SedeBE;
            if (_Request_Sede.LoadOptions.Contains("ListSede"))
            {
                SedeBL oSedeBL = new SedeBL();
                SedeBE oCopyBE = Mapper.Map<SedeBE, SedeBE>(SedeDTO);

                res.LstSede = oSedeBL.Listar(oCopyBE);
            }
            return res;
        }

        public Response_Sede ActualizarSede(Request_Sede _Request_Sede)
        {
            Response_Sede res = new Response_Sede();
            res.CorrelationId = _Request_Sede.RequestId;

            SedeBE SedeDTO = _Request_Sede.SedeDTO as SedeBE;

            if (_Request_Sede.LoadOptions.Contains("UpdSede"))
            {

                SedeBL oSedeBL = new SedeBL();
                SedeBE oCopyBE = Mapper.Map<SedeBE, SedeBE>(SedeDTO);


                res.UpdSede = oSedeBL.Actualizar(oCopyBE);
                SedeDTO.IDSede = oCopyBE.IDSede;
            }

            return res;
        }

        public Response_Sede EliminarSede(Request_Sede _Request_Sede)
        {
            Response_Sede res = new Response_Sede();
            res.CorrelationId = _Request_Sede.RequestId;

            SedeBE SedeDTO = _Request_Sede.SedeDTO as SedeBE;

            if (_Request_Sede.LoadOptions.Contains("DelSede"))
            {

                SedeBL oSedeBL = new SedeBL();
                SedeBE oCopyBE = Mapper.Map<SedeBE, SedeBE>(SedeDTO);

                res.InsSede = oSedeBL.Eliminar(oCopyBE);
                SedeDTO.IDSede = oCopyBE.IDSede;
            }

            return res;
        }

        public Response_Sede ObtenerSede(Request_Sede _Request_Sede)
        {
            Response_Sede res = new Response_Sede();
            res.CorrelationId = _Request_Sede.RequestId;

            SedeBE SedeDTO = _Request_Sede.SedeDTO as SedeBE;
            if (_Request_Sede.LoadOptions.Contains("GetSede"))
            {
                SedeBL oSedeBL = new SedeBL();
                SedeBE oCopyBE = Mapper.Map<SedeBE, SedeBE>(SedeDTO);

                res.GetSede = oSedeBL.Obtener(oCopyBE);
            }
            return res;
        }


        #endregion

        #region Bien

        public Response_Bien RegistrarBien(Request_Bien request)
        {
            Response_Bien response = new Response_Bien();
            response.CorrelationId = request.RequestId;

            BienBE BienDTO = request.BienDTO as BienBE;

            if (request.LoadOptions.Contains("AddBien"))
            {
                BienBL oBienBL = new BienBL();
                BienBE oCopyBE = Mapper.Map<BienBE, BienBE>(BienDTO);

                response.InsBien = oBienBL.Registrar(oCopyBE);

                BienDTO.IDBien = oCopyBE.IDBien;
            }

            return response;
        }

        public Response_Bien ObtenerBien(Request_Bien request)
        {
            Response_Bien response = new Response_Bien();
            response.CorrelationId = request.RequestId;

            BienBE BienDTO = request.BienDTO as BienBE;

            if (request.LoadOptions.Contains("GetBien"))
            {
                BienBL oBienBL = new BienBL();
                BienBE oCopyBE = Mapper.Map<BienBE, BienBE>(BienDTO);

                response.GetBien = oBienBL.Obtener(oCopyBE);

            }

            return response;
        }

        public Response_Bien ListarBien(Request_Bien request)
        {
            Response_Bien response = new Response_Bien();
            response.CorrelationId = request.RequestId;

            BienBE BienDTO = request.BienDTO as BienBE;

            if (request.LoadOptions.Contains("ListBien"))
            {
                BienBL oBienBL = new BienBL();
                BienBE oCopyBE = Mapper.Map<BienBE, BienBE>(BienDTO);

                response.LstBien = oBienBL.Listar(oCopyBE);
            }

            return response;
        }

        public Response_Bien ActualizarBien(Request_Bien request)
        {
            Response_Bien response = new Response_Bien();
            response.CorrelationId = request.RequestId;

            BienBE BienDTO = request.BienDTO as BienBE;

            if (request.LoadOptions.Contains("UpdBien"))
            {
                BienBL oBienBL = new BienBL();
                BienBE oCopyBE = Mapper.Map<BienBE, BienBE>(BienDTO);

                response.UpdBien = oBienBL.Actualizar(oCopyBE);

                BienDTO.IDBien = oCopyBE.IDBien;

            }

            return response;
        }

        #endregion

        #region Personal
        public Response_Personal RegistrarPersonal(Request_Personal _Request_Personal)
        {
            Response_Personal res = new Response_Personal();
            res.CorrelationId = _Request_Personal.RequestId;

            PersonalBE PersonalDTO = _Request_Personal.PersonalDTO as PersonalBE;

            if (_Request_Personal.LoadOptions.Contains("AddPersonal"))
            {

                PersonalBL oPersonalBL = new PersonalBL();
                PersonalBE oCopyBE = Mapper.Map<PersonalBE, PersonalBE>(PersonalDTO);

                res.InsPersonal = oPersonalBL.Registrar(oCopyBE);

                PersonalDTO.IDPersonal = oCopyBE.IDPersonal;
            }

            return res;
        }

        public Response_Personal ListarPersonal(Request_Personal _Request_Personal)
        {
            Response_Personal res = new Response_Personal();
            res.CorrelationId = _Request_Personal.RequestId;

            PersonalBE PersonalDTO = _Request_Personal.PersonalDTO as PersonalBE;
            if (_Request_Personal.LoadOptions.Contains("ListPersonal"))
            {
                PersonalBL oPersonalBL = new PersonalBL();
                PersonalBE oCopyBE = Mapper.Map<PersonalBE, PersonalBE>(PersonalDTO);

                res.LstPersonal = oPersonalBL.Listar(oCopyBE);
            }
            return res;
        }

        public Response_Personal ActualizarPersonal(Request_Personal _Request_Personal)
        {
            Response_Personal res = new Response_Personal();
            res.CorrelationId = _Request_Personal.RequestId;

            PersonalBE PersonalDTO = _Request_Personal.PersonalDTO as PersonalBE;

            if (_Request_Personal.LoadOptions.Contains("UpdPersonal"))
            {

                PersonalBL oPersonalBL = new PersonalBL();
                PersonalBE oCopyBE = Mapper.Map<PersonalBE, PersonalBE>(PersonalDTO);

                res.UpdPersonal = oPersonalBL.Actualizar(oCopyBE);
                PersonalDTO.IDPersonal = oCopyBE.IDPersonal;
            }

            return res;
        }




        public Response_Personal ObtenerPersonal(Request_Personal _Request_Personal)
        {
            Response_Personal response = new Response_Personal();


            if (_Request_Personal.LoadOptions.Contains("GetPersonal"))
            {
                PersonalBL oPersonalBL = new PersonalBL();
                response.GetPersonal = oPersonalBL.Obtener(_Request_Personal.PersonalDTO);
            }
            return response;
        }


        public Response_Personal EliminarPersonal(Request_Personal _Request_Personal)
        {
            Response_Personal res = new Response_Personal();
            res.CorrelationId = _Request_Personal.RequestId;

            PersonalBE PersonalDTO = _Request_Personal.PersonalDTO as PersonalBE;

            if (_Request_Personal.LoadOptions.Contains("DelPersonal"))
            {

                PersonalBL oPersonalBL = new PersonalBL();
                PersonalBE oCopyBE = Mapper.Map<PersonalBE, PersonalBE>(PersonalDTO);

                res.DelPersonal = oPersonalBL.Eliminar(oCopyBE);
                PersonalDTO.IDPersonal = oCopyBE.IDPersonal;
            }
            return res;
        }




        #endregion

        #region Proveedor

        public Response_Proveedor GetProveedorById(Request_Proveedor request)
        {
            Response_Proveedor response = new Response_Proveedor();

            if (request.LoadOptions.Contains("Listar"))
            {
                ProveedorBL oProveedorBL = new ProveedorBL();
                PersonalBL oPersonalBL = new PersonalBL();




                response.GetProveedor = oProveedorBL.Obtener(request.ProveedorDTO);
                response.listPersonalBE = oPersonalBL.Listar(request.PersonalBE);
            }
            return response;
        }

        public Response_Proveedor RegistrarProveedor(Request_Proveedor request)
        {
            Response_Proveedor response = new Response_Proveedor();
            try
            {
                if (request.LoadOptions.Contains("Add"))
                {
                    ProveedorBL oProveedorBL = new ProveedorBL();
                    PersonalBL oPersonalBL = new PersonalBL();


                    using (TransactionScope trans = new TransactionScope())
                    {

                        response.InsProveedor = oProveedorBL.Registrar(request.ProveedorDTO);

                        if (request.listPersonalBE != null)
                        {
                            foreach (var personal in request.listPersonalBE)
                            {
                                //responsable.cliId = customerId;
                                personal.OrigenPers = 2;
                                personal.IDOrigen = response.InsProveedor;
                                oPersonalBL.Registrar(personal);

                            }
                        }
                        trans.Complete();
                    }
                }

            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;
            }

            return response;
        }


        public Response_Proveedor ListProveedor(Request_Proveedor request)
        {
            Response_Proveedor response = new Response_Proveedor();

            if (request.LoadOptions.Contains("Listar"))
            {
                ProveedorBL oProveedorBL = new ProveedorBL();
                response.LstProveedor = oProveedorBL.Listar(request.ProveedorDTO);
            }
            return response;
        }


        public Response_Proveedor BuscarProveedor(Request_Proveedor request)
        {
            Response_Proveedor response = new Response_Proveedor();

            if (request.LoadOptions.Contains("Buscar"))
            {
                ProveedorBL oProveedorBL = new ProveedorBL();
                response.LstProveedor = oProveedorBL.BuscarProveedor(request.ProveedorDTO);



            }
            return response;
        }




        public Response_Proveedor GetProveedorByRuc(Request_Proveedor request)
        {
            Response_Proveedor response = new Response_Proveedor();

            if (request.LoadOptions.Contains("Listar"))
            {
                ProveedorBL oProveedorBL = new ProveedorBL();
                PersonalBL oPersonalBL = new PersonalBL();

                response.GetProveedor = oProveedorBL.ObtenerXRuc(request.ProveedorDTO);

                if (response.GetProveedor != null)
                {
                    request.PersonalBE.IDOrigen = response.GetProveedor.IDProveedor;
                    response.listPersonalBE = oPersonalBL.Listar(request.PersonalBE);
                }


            }
            return response;
        }

        public Response_Proveedor ActualizarProveedor(Request_Proveedor request)
        {

            Response_Proveedor response = new Response_Proveedor();
            try
            {
                if (request.LoadOptions.Contains("update"))
                {
                    ProveedorBL oProveedorBL = new ProveedorBL();
                    PersonalBL oPersonalBL = new PersonalBL();


                    using (TransactionScope trans = new TransactionScope())
                    {

                        response.UpdProveedor = oProveedorBL.Actualizar(request.ProveedorDTO);

                        var idpro = request.ProveedorDTO.IDProveedor;

                        if (request.listPersonalBE != null)
                        {
                            foreach (var personal in request.listPersonalBE)
                            {
                                personal.OrigenPers = 2;
                                personal.IDOrigen = idpro;

                                if (personal.IDPersonal > 0)
                                {

                                    oPersonalBL.Actualizar(personal);
                                }
                                else if (personal.IDPersonal <= 0)
                                {

                                    oPersonalBL.Registrar(personal);
                                }

                            }
                        }

                        if (request.toDelete != null)
                        {
                            foreach (var id in request.toDelete)
                            {
                                oPersonalBL.Eliminar(new PersonalBE() { IDPersonal = id });

                            }

                        }

                        trans.Complete();
                    }
                }

            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;
            }

            return response;

        }



        #endregion

        #region ImagenBien


        public Response_ImagenBien RegistrarImagenBien(Request_ImagenBien request)
        {
            Response_ImagenBien response = new Response_ImagenBien();
            response.CorrelationId = request.RequestId;

            ImagenBienBE ImagenBienDTO = request.ImagenBienDTO as ImagenBienBE;

            if (request.LoadOptions.Contains("AddImagenBien"))
            {
                ImagenBienBL oImagenBienBL = new ImagenBienBL();
                ImagenBienBE oCopyBE = Mapper.Map<ImagenBienBE, ImagenBienBE>(ImagenBienDTO);

                response.InsImagenBien = oImagenBienBL.Registrar(oCopyBE);

                ImagenBienDTO.IDImagenBien = oCopyBE.IDImagenBien;
            }

            return response;
        }


        public Response_ImagenBien ListarImagenBien(Request_ImagenBien request)
        {
            Response_ImagenBien response = new Response_ImagenBien();
            response.CorrelationId = request.RequestId;

            ImagenBienBE ImagenBienDTO = request.ImagenBienDTO as ImagenBienBE;

            if (request.LoadOptions.Contains("ListImagenBien"))
            {
                ImagenBienBL oImagenBienBL = new ImagenBienBL();
                ImagenBienBE oCopyBE = Mapper.Map<ImagenBienBE, ImagenBienBE>(ImagenBienDTO);

                response.LstImagenBien = oImagenBienBL.Listar(oCopyBE);
            }

            return response;
        }


        public Response_ImagenBien ObtenerImagenBien(Request_ImagenBien request)
        {
            Response_ImagenBien response = new Response_ImagenBien();
            response.CorrelationId = request.RequestId;

            ImagenBienBE ImagenBienDTO = request.ImagenBienDTO as ImagenBienBE;

            if (request.LoadOptions.Contains("GetImagenBien"))
            {
                ImagenBienBL oImagenBienBL = new ImagenBienBL();
                ImagenBienBE oCopyBE = Mapper.Map<ImagenBienBE, ImagenBienBE>(ImagenBienDTO);

                response.GetImagenBien = oImagenBienBL.Obtener(oCopyBE);

            }

            return response;
        }




        #endregion

        #region BajaActivos

        public Response_BajaActivo RegistrarBajaActivo(Request_BajaActivo request)
        {
            Response_BajaActivo response = new Response_BajaActivo();
            response.CorrelationId = request.RequestId;

            BajaActivoBE BajaActivoDTO = request.BajaActivoDTO as BajaActivoBE;

            try
            {
                if (request.LoadOptions.Contains("AddBajaActivo"))
                {
                    BajaActivoBL oBajaActivoBL = new BajaActivoBL();
                    BajaActivoDetalleBL oBajaActivoDetalleBL = new BajaActivoDetalleBL();
                    BajaActivoBE oCopyBE = Mapper.Map<BajaActivoBE, BajaActivoBE>(BajaActivoDTO);


                    using (TransactionScope trans = new TransactionScope())
                    {

                        response.InsBajaActivo = oBajaActivoBL.Registrar(request.BajaActivoDTO);

                        if (request.listBajaActivoDetalleBE != null)
                        {
                            foreach (var bajas in request.listBajaActivoDetalleBE)
                            {
                                bajas.IDBajaActivo = response.InsBajaActivo;
                                oBajaActivoDetalleBL.Registrar(bajas);
                            }
                        }
                        trans.Complete();
                    }
                }

            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;
            }

            return response;
        }


        public Response_BajaActivo ListarBajaActivo(Request_BajaActivo request)
        {
            Response_BajaActivo response = new Response_BajaActivo();
            response.CorrelationId = request.RequestId;

            BajaActivoBE BajaActivoDTO = request.BajaActivoDTO as BajaActivoBE;

            if (request.LoadOptions.Contains("ListBajaActivo"))
            {
                BajaActivoBL oBajaActivoBL = new BajaActivoBL();
                BajaActivoBE oCopyBE = Mapper.Map<BajaActivoBE, BajaActivoBE>(BajaActivoDTO);

                response.LstBajaActivo = oBajaActivoBL.Listar(oCopyBE);
            }

            return response;
        }


        public Response_BajaActivo ObtenerBajaActivo(Request_BajaActivo request)
        {
            Response_BajaActivo response = new Response_BajaActivo();
            response.CorrelationId = request.RequestId;

            BajaActivoBE BajaActivoDTO = request.BajaActivoDTO as BajaActivoBE;

            if (request.LoadOptions.Contains("GetBajaActivo"))
            {
                BajaActivoBL oBajaActivoBL = new BajaActivoBL();
                BajaActivoBE oCopyBE = Mapper.Map<BajaActivoBE, BajaActivoBE>(BajaActivoDTO);

                response.GetBajaActivo = oBajaActivoBL.Obtener(oCopyBE);
            }

            return response;
        }


        public Response_BajaActivo ActualizarBajaActivo(Request_BajaActivo request)
        {

            Response_BajaActivo response = new Response_BajaActivo();
            response.CorrelationId = request.RequestId;

            BajaActivoBE BajaActivoDTO = request.BajaActivoDTO as BajaActivoBE;

            try
            {
                if (request.LoadOptions.Contains("UpdBajaActivo"))
                {
                    BajaActivoBL oBajaActivoBL = new BajaActivoBL();
                    BajaActivoDetalleBL oBajaActivoDetalleBL = new BajaActivoDetalleBL();
                    BajaActivoBE oCopyBE = Mapper.Map<BajaActivoBE, BajaActivoBE>(BajaActivoDTO);



                    using (TransactionScope trans = new TransactionScope())
                    {

                        response.UpdBajaActivo = oBajaActivoBL.Actualizar(request.BajaActivoDTO);

                        var IDBaja = request.BajaActivoDTO.IDBajaActivo;

                        if (request.listBajaActivoDetalleBE != null)
                        {
                            foreach (var bajas in request.listBajaActivoDetalleBE)
                            {
                                if (bajas.IDBajaActivo > 0)
                                {

                                    oBajaActivoDetalleBL.Actualizar(bajas);
                                }
                                else if (bajas.IDBajaActivo <= 0)
                                {
                                    bajas.IDBajaActivo = IDBaja;
                                    oBajaActivoDetalleBL.Registrar(bajas);
                                }

                            }
                        }

                        if (request.toDelete != null)
                        {
                            foreach (var eliminados in request.toDelete)
                            {
                                eliminados.EstadoBajaActivo = 2;
                                oBajaActivoDetalleBL.Eliminar(eliminados);
                            }

                        }

                        trans.Complete();
                    }
                }

            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;
            }

            return response;

        }



        #endregion

        #region BajaActivoDetalle

        public Response_BajaActivoDetalle RegistrarBajaActivoDetalle(Request_BajaActivoDetalle request)
        {
            Response_BajaActivoDetalle response = new Response_BajaActivoDetalle();
            response.CorrelationId = request.RequestId;

            BajaActivoDetalleBE BajaActivoDetalleDTO = request.BajaActivoDetalleDTO as BajaActivoDetalleBE;

            if (request.LoadOptions.Contains("AddBajaActivoDetalle"))
            {
                BajaActivoDetalleBL oBajaActivoDetalleBL = new BajaActivoDetalleBL();
                BajaActivoDetalleBE oCopyBE = Mapper.Map<BajaActivoDetalleBE, BajaActivoDetalleBE>(BajaActivoDetalleDTO);

                response.InsBajaActivoDetalle = oBajaActivoDetalleBL.Registrar(oCopyBE);

                BajaActivoDetalleDTO.IDBajaActivo = oCopyBE.IDBajaActivo;
            }

            return response;
        }

        public Response_BajaActivoDetalle ListarBajaActivoDetalle(Request_BajaActivoDetalle request)
        {
            Response_BajaActivoDetalle response = new Response_BajaActivoDetalle();
            response.CorrelationId = request.RequestId;

            BajaActivoDetalleBE BajaActivoDetalleDTO = request.BajaActivoDetalleDTO as BajaActivoDetalleBE;

            if (request.LoadOptions.Contains("ListBajaActivoDetalle"))
            {
                BajaActivoDetalleBL oBajaActivoDetalleBL = new BajaActivoDetalleBL();
                BajaActivoDetalleBE oCopyBE = Mapper.Map<BajaActivoDetalleBE, BajaActivoDetalleBE>(BajaActivoDetalleDTO);

                response.LstBajaActivoDetalle = oBajaActivoDetalleBL.Listar(oCopyBE);
            }

            return response;
        }


        public Response_BajaActivoDetalle ObtenerBajaActivoDetalle(Request_BajaActivoDetalle request)
        {
            Response_BajaActivoDetalle response = new Response_BajaActivoDetalle();
            response.CorrelationId = request.RequestId;

            BajaActivoDetalleBE BajaActivoDetalleDTO = request.BajaActivoDetalleDTO as BajaActivoDetalleBE;

            if (request.LoadOptions.Contains("GetBajaActivoDetalle"))
            {
                BajaActivoDetalleBL oBajaActivoDetalleBL = new BajaActivoDetalleBL();
                BajaActivoDetalleBE oCopyBE = Mapper.Map<BajaActivoDetalleBE, BajaActivoDetalleBE>(BajaActivoDetalleDTO);

                response.GetBajaActivoDetalle = oBajaActivoDetalleBL.Obtener(oCopyBE);
            }

            return response;
        }


        public Response_BajaActivoDetalle ActualizarBajaActivoDetalle(Request_BajaActivoDetalle request)
        {
            Response_BajaActivoDetalle response = new Response_BajaActivoDetalle();
            response.CorrelationId = request.RequestId;

            BajaActivoDetalleBE BajaActivoDetalleDTO = request.BajaActivoDetalleDTO as BajaActivoDetalleBE;

            if (request.LoadOptions.Contains("UpdBajaActivoDetalle"))
            {
                BajaActivoDetalleBL oBajaActivoDetalleBL = new BajaActivoDetalleBL();
                BajaActivoDetalleBE oCopyBE = Mapper.Map<BajaActivoDetalleBE, BajaActivoDetalleBE>(BajaActivoDetalleDTO);

                response.UpdBajaActivoDetalle = oBajaActivoDetalleBL.Actualizar(oCopyBE);

                BajaActivoDetalleDTO.IDBajaActivo = oCopyBE.IDBajaActivo;

            }

            return response;
        }

        public Response_BajaActivoDetalle EliminarBajaActivoDetalle(Request_BajaActivoDetalle request)
        {
            Response_BajaActivoDetalle response = new Response_BajaActivoDetalle();
            response.CorrelationId = request.RequestId;

            BajaActivoDetalleBE BajaActivoDetalleDTO = request.BajaActivoDetalleDTO as BajaActivoDetalleBE;

            if (request.LoadOptions.Contains("DelBajaActivoDetalle"))
            {

                BajaActivoDetalleBL oBajaActivoDetalleBL = new BajaActivoDetalleBL();
                BajaActivoDetalleBE oCopyBE = Mapper.Map<BajaActivoDetalleBE, BajaActivoDetalleBE>(BajaActivoDetalleDTO);

                response.DelBajaActivoDetalle = oBajaActivoDetalleBL.Eliminar(oCopyBE);
                BajaActivoDetalleDTO.IDBajaActivo = oCopyBE.IDBajaActivo;
            }
            return response;
        }



        #endregion

        #region Material

        public Response_Material RegistrarMaterial(Request_Material _Request_Material)
        {
            Response_Material res = new Response_Material();
            res.CorrelationId = _Request_Material.RequestId;

            MaterialBE MaterialDTO = _Request_Material.MaterialDTO as MaterialBE;

            if (_Request_Material.LoadOptions.Contains("AddMaterial"))
            {

                MaterialBL oMaterialBL = new MaterialBL();
                MaterialBE oCopyBE = Mapper.Map<MaterialBE, MaterialBE>(MaterialDTO);

                res.InsMaterial = oMaterialBL.Registrar(oCopyBE);

                MaterialDTO.IDSede = oCopyBE.IDSede;
            }

            return res;
        }

        public Response_Material ActualizarMaterial(Request_Material _Request_Material)
        {
            Response_Material res = new Response_Material();
            res.CorrelationId = _Request_Material.RequestId;

            MaterialBE MaterialDTO = _Request_Material.MaterialDTO as MaterialBE;

            if (_Request_Material.LoadOptions.Contains("UpdMaterial"))
            {

                MaterialBL oMaterialBL = new MaterialBL();
                MaterialBE oCopyBE = Mapper.Map<MaterialBE, MaterialBE>(MaterialDTO);

                res.UpdMaterial = oMaterialBL.Actualizar(oCopyBE);

                MaterialDTO.IDSede = oCopyBE.IDSede;
            }

            return res;
        }


        public Response_Material ListarStockMaterial(Request_Material _Request_Material)
        {
            Response_Material res = new Response_Material();
            res.CorrelationId = _Request_Material.RequestId;

            MaterialBE MaterialDTO = _Request_Material.MaterialDTO as MaterialBE;
            if (_Request_Material.LoadOptions.Contains("ListStockMaterial"))
            {
                MaterialBL oMaterialBL = new MaterialBL();
                MaterialBE oCopyBE = Mapper.Map<MaterialBE, MaterialBE>(MaterialDTO);

                res.LstStockMaterial = oMaterialBL.ListarStockMaterial(oCopyBE);
            }
            return res;
        }

        public Response_Material ObtenerMaterial(Request_Material _Request_Material)
        {
            Response_Material res = new Response_Material();
            res.CorrelationId = _Request_Material.RequestId;

            MaterialBE MaterialDTO = _Request_Material.MaterialDTO as MaterialBE;
            if (_Request_Material.LoadOptions.Contains("GetMaterial"))
            {
                MaterialBL oMaterialBL = new MaterialBL();
                MaterialBE oCopyBE = Mapper.Map<MaterialBE, MaterialBE>(MaterialDTO);

                res.GetMaterial = oMaterialBL.Obtener(oCopyBE);
            }
            return res;
        }

        public Response_Material ListaProveedoresXMaterial(Request_Material _Request_Material)
        {
            Response_Material res = new Response_Material();
            res.CorrelationId = _Request_Material.RequestId;

            MaterialBE MaterialDTO = _Request_Material.MaterialDTO as MaterialBE;
            if (_Request_Material.LoadOptions.Contains("LstProveedoresXMaterial"))
            {
                MaterialBL oMaterialBL = new MaterialBL();
                MaterialBE oCopyBE = Mapper.Map<MaterialBE, MaterialBE>(MaterialDTO);

                res.LstProveedoresXMaterial = oMaterialBL.ListarProveedoresXMaterial(oCopyBE);
            }
            return res;
        }
        #endregion






























        #region TransferenciaActivos

        public Response_TransferenciaActivos ListarTransferenciaActivo(Request_TransferenciaActivos request)
        {
            Response_TransferenciaActivos response = new Response_TransferenciaActivos();
            response.CorrelationId = request.RequestId;

            TransferenciaActivosBE TransferenciaActivosDTO = request.TransferenciaActivosDTO as TransferenciaActivosBE;

            if (request.LoadOptions.Contains("ListTransActivo"))
            {
                TransferenciaActivosBL oTransActivoBL = new TransferenciaActivosBL();
                TransferenciaActivosBE oCopyBE = Mapper.Map<TransferenciaActivosBE, TransferenciaActivosBE>(TransferenciaActivosDTO);

                response.LstTransferenciaActivos = oTransActivoBL.Listar(oCopyBE);
            }

            return response;
        }


        public Response_TransferenciaActivos RegistrarTransferenciaActivo(Request_TransferenciaActivos request)
        {
            Response_TransferenciaActivos response = new Response_TransferenciaActivos();
            response.CorrelationId = request.RequestId;

            TransferenciaActivosBE TransferenciaActivosDTO = request.TransferenciaActivosDTO as TransferenciaActivosBE;

            try
            {
                if (request.LoadOptions.Contains("AddTransActivo"))
                {
                    TransferenciaActivosBL oTransActivoBL = new TransferenciaActivosBL();
                    TransferenciaActivoDetalleBL oTransActivoDetalleBL = new TransferenciaActivoDetalleBL();
                    TransferenciaActivosBE oCopyBE = Mapper.Map<TransferenciaActivosBE, TransferenciaActivosBE>(TransferenciaActivosDTO);

                    using (TransactionScope trans = new TransactionScope())
                    {

                        response.InsTransferenciaActivos = oTransActivoBL.Registrar(request.TransferenciaActivosDTO);

                        if (request.listTransActivoDetalleBE != null)
                        {
                            foreach (var transActivo in request.listTransActivoDetalleBE)
                            {
                                transActivo.IDTransfer = response.InsTransferenciaActivos;
                                oTransActivoDetalleBL.Registrar(transActivo);
                            }
                        }
                        trans.Complete();
                    }
                }

            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;
            }

            return response;
        }

        public Response_TransferenciaActivos ObtenerTransferenciaActivo(Request_TransferenciaActivos request)
        {
            Response_TransferenciaActivos response = new Response_TransferenciaActivos();
            response.CorrelationId = request.RequestId;

            TransferenciaActivosBE TransferenciaActivosDTO = request.TransferenciaActivosDTO as TransferenciaActivosBE;

            if (request.LoadOptions.Contains("GetTransActivo"))
            {
                TransferenciaActivosBL oTransActivoBL = new TransferenciaActivosBL();
                TransferenciaActivosBE oCopyBE = Mapper.Map<TransferenciaActivosBE, TransferenciaActivosBE>(TransferenciaActivosDTO);

                response.GetTransferenciaActivos = oTransActivoBL.Obtener(oCopyBE);
            }

            return response;
        }


        public Response_TransferenciaActivos ActualizarTransferenciaActivo(Request_TransferenciaActivos request)
        {

            Response_TransferenciaActivos response = new Response_TransferenciaActivos();
            response.CorrelationId = request.RequestId;

            TransferenciaActivosBE TransferenciaActivosDTO = request.TransferenciaActivosDTO as TransferenciaActivosBE;

            try
            {
                if (request.LoadOptions.Contains("UpdTransActivo"))
                {
                    TransferenciaActivosBL oTransActivoBL = new TransferenciaActivosBL();
                    TransferenciaActivoDetalleBL oTransActivoDetalleBL = new TransferenciaActivoDetalleBL();
                    TransferenciaActivosBE oCopyBE = Mapper.Map<TransferenciaActivosBE, TransferenciaActivosBE>(TransferenciaActivosDTO);


                    using (TransactionScope trans = new TransactionScope())
                    {

                        response.UpdTransferenciaActivos = oTransActivoBL.Actualizar(request.TransferenciaActivosDTO);

                        var IDTrans = request.TransferenciaActivosDTO.IDTransfer;

                        if (request.listTransActivoDetalleBE != null)
                        {
                            foreach (var transActivo in request.listTransActivoDetalleBE)
                            {
                                if (transActivo.IDTransfer > 0)
                                {

                                    oTransActivoDetalleBL.Actualizar(transActivo);
                                }
                                else if (transActivo.IDTransfer <= 0)
                                {
                                    transActivo.IDTransfer = IDTrans; 
                                    oTransActivoDetalleBL.Registrar(transActivo);
                                }

                            }
                        }

                        if (request.toDelete != null)
                        {
                            foreach (var eliminados in request.toDelete)
                            {
                                oTransActivoDetalleBL.Eliminar(eliminados);
                            }

                        }

                        trans.Complete();
                    }
                }

            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;
            }

            return response;

        }



        #endregion


        #region TransferenciaActivosDetalle

        public Response_TransferenciaActivoDetalle ListarTransferenciaActivoDetalle(Request_TransferenciaActivoDetalle request)
        {
            Response_TransferenciaActivoDetalle response = new Response_TransferenciaActivoDetalle();
            response.CorrelationId = request.RequestId;

            TransferenciaActivoDetalleBE TransferenciaActivoDetalleDTO = request.TransferenciaActivoDetalleDTO as TransferenciaActivoDetalleBE;

            if (request.LoadOptions.Contains("ListTransActivoDetalle"))
            {
                TransferenciaActivoDetalleBL oTransActivoDetalleBL = new TransferenciaActivoDetalleBL();
                TransferenciaActivoDetalleBE oCopyBE = Mapper.Map<TransferenciaActivoDetalleBE, TransferenciaActivoDetalleBE>(TransferenciaActivoDetalleDTO);

                response.LstTransferenciaActivoDetalle = oTransActivoDetalleBL.Listar(oCopyBE);
            }

            return response;
        }


        #endregion


        #region Sistema

        public Response_Bien ObtenerSistema(Request_Bien request)
        {
            Response_Bien response = new Response_Bien();
            response.CorrelationId = request.RequestId;

            BienBE BienDTO = request.BienDTO as BienBE;

            if (request.LoadOptions.Contains("GetSistema"))
            {
                BienBL oBienBL = new BienBL();
                BienBE oCopyBE = Mapper.Map<BienBE, BienBE>(BienDTO);

                response.GetSistema = oBienBL.ObtenerSistema(oCopyBE);

            }

            return response;
        }


        public Response_Bien BuscarActivos(Request_Bien request)
        {
            Response_Bien response = new Response_Bien();
            response.CorrelationId = request.RequestId;

            BienBE BienDTO = request.BienDTO as BienBE;

            if (request.LoadOptions.Contains("SearchActivos"))
            {
                BienBL oBienBL = new BienBL();
                BienBE oCopyBE = Mapper.Map<BienBE, BienBE>(BienDTO);

                response.SearchActivos = oBienBL.BuscarActivos(oCopyBE);
            }

            return response;
        }


        public Response_DetalleBien RegistrarSistema(Request_DetalleBien request)
        {
            Response_DetalleBien response = new Response_DetalleBien();
            response.CorrelationId = request.RequestId;

            DetalleBienBE DetalleBienDTO = request.DetalleBienDTO as DetalleBienBE;

            try
            {
                if (request.LoadOptions.Contains("AddSistema"))
                {
                    DetalleBienBL oSistemaBL = new DetalleBienBL();
                    DetalleBienBE oCopyBE = Mapper.Map<DetalleBienBE, DetalleBienBE>(DetalleBienDTO);



                    using (TransactionScope trans = new TransactionScope())
                    {

                        //response.InsDetalleBien = oTransActivoBL.Registrar(request.TransferenciaActivosDTO);

                        if (request.LstActivos != null)
                        {
                            foreach (var activos in request.LstActivos)
                            {
                                DetalleBienBE obj = new DetalleBienBE();
                                obj.IdSistema = DetalleBienDTO.IdSistema;
                                obj.IdBien = activos.IDBien;

                                oSistemaBL.Registrar(obj);
                            }
                        }
                        trans.Complete();
                    }
                }

            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;
            }

            return response;
        }


        public Response_DetalleBien ListarSistema(Request_DetalleBien request)
        {
            Response_DetalleBien response = new Response_DetalleBien();
            response.CorrelationId = request.RequestId;

            DetalleBienBE DetalleBienDTO = request.DetalleBienDTO as DetalleBienBE;

            if (request.LoadOptions.Contains("ListSistema"))
            {
                DetalleBienBL oSistemaBL = new DetalleBienBL();
                DetalleBienBE oCopyBE = Mapper.Map<DetalleBienBE, DetalleBienBE>(DetalleBienDTO);

                response.LstDetalleBien = oSistemaBL.Listar(oCopyBE);
            }

            return response;
        }


        public Response_Bien ObtenerBienxID(Request_Bien request)
        {
            Response_Bien response = new Response_Bien();
            response.CorrelationId = request.RequestId;

            BienBE BienDTO = request.BienDTO as BienBE;

            if (request.LoadOptions.Contains("GetBienxID"))
            {
                BienBL oBienBL = new BienBL();
                BienBE oCopyBE = Mapper.Map<BienBE, BienBE>(BienDTO);

                response.GetBienxID = oBienBL.ObtenerxID(oCopyBE);

            }

            return response;
        }


        #endregion
    }
}